[IA64] fix {un}lock_ipi_calllock().
authorIsaku Yamahata <yamahata@valinux.co.jp>
Tue, 4 Nov 2008 05:35:24 +0000 (14:35 +0900)
committerIsaku Yamahata <yamahata@valinux.co.jp>
Tue, 4 Nov 2008 05:35:24 +0000 (14:35 +0900)
Now _raw_spin_lock() checks whether interrupt is masked or not.
If masked, it panics.
lock_ipi_calllock() violates the assumption.
This patch make lock_ipi_calllock() use spin_lock_irqsave()
instead of spin_lock_irq().

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
xen/arch/ia64/linux-xen/smp.c
xen/arch/ia64/linux-xen/smpboot.c
xen/include/asm-ia64/linux-xen/asm/smp.h

index 5ebe45cf3836fe30f430a04a930ba449993db607..43786124f180ee95bb555f9d6455725decc2256d 100644 (file)
@@ -101,6 +101,20 @@ static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned;
 
 extern void cpu_halt (void);
 
+#ifdef XEN
+/* work around for spinlock irq check. */
+void
+lock_ipi_calllock(unsigned long *flags)
+{
+       spin_lock_irqsave(&call_lock, *flags);
+}
+
+void
+unlock_ipi_calllock(unsigned long flags)
+{
+       spin_unlock_irqrestore(&call_lock, flags);
+}
+#else
 void
 lock_ipi_calllock(void)
 {
@@ -112,6 +126,7 @@ unlock_ipi_calllock(void)
 {
        spin_unlock_irq(&call_lock);
 }
+#endif
 
 static void
 stop_this_cpu (void)
index 0cc4de2cd5d8b693069e2e8e3cca8b1bf5ec30ea..ef7f9ea2ff54fc0fe6bb64d5e535fae5d97adf34 100644 (file)
@@ -364,6 +364,10 @@ smp_setup_percpu_timer (void)
 static void __devinit
 smp_callin (void)
 {
+#ifdef XEN
+       /* work around for spinlock irq assert. */
+       unsigned long flags;
+#endif
        int cpuid, phys_id;
        extern void ia64_init_itm(void);
 
@@ -382,9 +386,17 @@ smp_callin (void)
 
        fix_b0_for_bsp();
 
+#ifdef XEN
+       lock_ipi_calllock(&flags);
+#else
        lock_ipi_calllock();
+#endif
        cpu_set(cpuid, cpu_online_map);
+#ifdef XEN
+       unlock_ipi_calllock(flags);
+#else
        unlock_ipi_calllock();
+#endif
        per_cpu(cpu_state, cpuid) = CPU_ONLINE;
 
        smp_setup_percpu_timer();
index 558702b2009769243ca8d788e2de0bc0b441f7fb..048450a3ffb0239c4012efd00f025dd47093d062 100644 (file)
@@ -131,8 +131,13 @@ extern void smp_do_timer (struct pt_regs *regs);
 extern int smp_call_function_single (int cpuid, void (*func) (void *info), void *info,
                                     int retry, int wait);
 extern void smp_send_reschedule (int cpu);
+#ifdef XEN
+extern void lock_ipi_calllock(unsigned long *flags);
+extern void unlock_ipi_calllock(unsigned long flags);
+#else
 extern void lock_ipi_calllock(void);
 extern void unlock_ipi_calllock(void);
+#endif
 extern void identify_siblings (struct cpuinfo_ia64 *);
 
 #else